<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="Hugo 0.98.0" />

  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <meta name="author" content="" />
  <meta property="og:url" content="/posts/%E7%A4%BE%E5%8C%BA%E4%B9%A6%E7%B1%8D/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E5%8E%86%E7%A8%8B/%E5%88%86%E5%B1%82%E6%A8%A1%E5%9E%8B%E4%B8%8E%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%A8%A1%E5%BC%8F/" />
  <link rel="canonical" href="/posts/%E7%A4%BE%E5%8C%BA%E4%B9%A6%E7%B1%8D/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E5%8E%86%E7%A8%8B/%E5%88%86%E5%B1%82%E6%A8%A1%E5%9E%8B%E4%B8%8E%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%A8%A1%E5%BC%8F/" /><link rel="alternate" type="application/atom+xml" href="/index.xml" title="信息管理实验室">

  <script type="application/ld+json">
  {
      "@context" : "http://schema.org",
      "@type" : "BlogPosting",
      "mainEntityOfPage": {
           "@type": "WebPage",
           "@id": "\/"
      },
      "articleSection" : "posts",
      "name" : "学习历程：分层模型与客户端服务器模式",
      "headline" : "学习历程：分层模型与客户端服务器模式",
      "description" : "在前文中，我们对计算机网络的微观层面与宏观层面进行了简单的分析，发现：在进行软件层上的网络程序设计时，我们可以将网络数据的读写视作为对“远程文件\u0026quot;的读写。\n扎根于这一基础之上，我们计划更加深入地对计算机网络开发进行讨论，以分层模型与客户端服务器模式进行切入。\n分层模型 分层模型的本质，就是对“主机-主机\u0026quot;中的流程进行分解，下面，我们可以通过文字对这一完整的流程进行叙述，并最后将其总结为“分层模型\u0026quot;。\n对于一名软件设计者而言，想要顺利地完成网络数据的读写，就必须确定如下的事务：\n 数据包的格式 主机间交换数据的方式 主机间定位的方式  网页读写就是一个好的案例，我们现在就可以开始分析他们。\n应用层：简单的文本数据交换 在打开网页的时候，我们的浏览器往往会向对应的服务器发送一个数据包，作为请求数据\n以启动我们信息管理实验室的首页为例，在启动网页以后，我们可以按下 F12 打开网络开发者工具（FireFox），看到网页浏览器的请求数据包。\n将其中的重要信息进行提取，可以得到\nGET \/ HTTP\/1.1 它指出了需要进行的动作 \u0026lsquo;GET\u0026rsquo;（获取），要获取的对象为\u0026rsquo;\/\u0026rsquo;（代表网站根目录，一般情况下就是网站的首页），而 HTTP\/1.1 则是这一协议的名称与版本号，它是一个应用层协议，对于类似于上面这样的可读文本进行了相关的规定，确保我们的应用之间可以以一种合理的形式请求数据，发送数据。\n这种以我们可以轻松阅读的文本格式所进行的数据收发，就是应用层所进行的操作，如你所见，比起复杂的电子信号传输，它非常简单，易懂。\n我们大部分的开发，就是在应用层上进行的。\n传输层：以合理的方式进行数据交接 在请求数据包填写完成之后，我们需要选择一种合理的方式，将我们的请求数据包发送到服务器上\n数据包的收发读写，是两台不同主机之间的数据交换，因此，我们当然需要找到一种稳定的数据交换方式。\n这就是传输层的工作，完成这份工作的协议分为 TCP 与 UDP 两种，对于我们的网页浏览工作而言，我们往往选择 TCP 协议。\n网络层：定位我们的网络设备 在选择数据的传输方式之后，我们还需要正式定位目标服务器的地址，将我们的数据包传输过去\n在这里，我们可以暂时切断我们的网络连接，并对我们网页浏览器发送的数据包进行查看。\n可以很明确地发现，我们的请求数据包，协议等依旧保持不变，唯一的区别在于 \u0026lsquo;We can\u0026rsquo;t connect to the server\u0026rsquo;（我们无法连接到服务器）\n从硬件上看，这是因为两台主机之间的数据链路没能建立，而在软件上看，错误在于：没能完成对目标主机的定位工作。\n而当我们再次完成网络连接以后，我们可以继续顺利地连接网络，不过这一次，我们可以更换一种连接方式，选择 ping\n这一次，出现了一个数字串 14.215.177.38，这被称为 “IP地址\u0026quot;（IPv4），它的实质是一个二进制数字串，代表了网络设备的地址\n这种采用二进制数字串标识设备，确定连接地址的工作，就是网络层的工作，它需要来自于硬件的支持。\n链路层与物理层：来自于硬件层面的支持 对于软件开发者而言，我们可以更多的对于这些硬件层面的协议保持一个 “知道有，不了解过多\u0026quot; 的态度，因为这些复杂的硬件层面事物，更多的由操作系统与硬件驱动为我们代劳，我们的精力，可以集中于应用层、传输层与网络层这些软件层上面的事物，并依托操作系统的系统调用（实际上就是一组设计良好的C语言函数)进行处理。\n小结：分层模型与 OSI 参考模型 分层模型的正式模型是“TCP\/IP 模型“，它是应用广泛的现实主义模型，而 OSI 模型是一个理论上的模型，我们可以把他们作一个简单的了解。\n客户端服务器模式 许多的网络书籍喜欢将计算机网络数据的读写划分为“客户端服务器模型\u0026quot;与“P2P模型\u0026quot;，而我本人则更加倾向于：两种模型没有本质上的区别，他们都是主机与主机之间的数据读写。\n唯一的不同在于，哪一方主机预先发起了数据交换的请求。\n案例：网页浏览 还是以网页浏览为案例，只不过，这一次，我们以“远程文件读写\u0026quot;的方式去看待。\n我们欢迎你尝试如下的指令（假定你安装了 php 包，并且属于 Linux 操作系统）",
      "inLanguage" : "en-US",
      "author" : "",
      "creator" : "",
      "publisher": "",
      "accountablePerson" : "",
      "copyrightHolder" : "",
      "copyrightYear" : "2023",
      "datePublished": "2023-02-04 00:00:00 \u002b0000 UTC",
      "dateModified" : "2023-02-04 00:00:00 \u002b0000 UTC",
      "url" : "\/posts\/%E7%A4%BE%E5%8C%BA%E4%B9%A6%E7%B1%8D\/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E5%8E%86%E7%A8%8B\/%E5%88%86%E5%B1%82%E6%A8%A1%E5%9E%8B%E4%B8%8E%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%A8%A1%E5%BC%8F\/",
      "keywords" : [ "计算机网络","信息管理", ]
  }
</script>
<title>学习历程：分层模型与客户端服务器模式</title>
  <meta property="og:title" content="学习历程：分层模型与客户端服务器模式" />
  <meta property="og:type" content="article" />
  <meta property="og:description" content="在前文中，我们对计算机网络的微观层面与宏观层面进行了简单的分析，发现：在进行软件层上的网络程序设计时，我们可以将网络数据的读写视作为对“远程文件&amp;quot;的读写。
扎根于这一基础之上，我们计划更加深入地对计算机网络开发进行讨论，以分层模型与客户端服务器模式进行切入。
分层模型 分层模型的本质，就是对“主机-主机&amp;quot;中的流程进行分解，下面，我们可以通过文字对这一完整的流程进行叙述，并最后将其总结为“分层模型&amp;quot;。
对于一名软件设计者而言，想要顺利地完成网络数据的读写，就必须确定如下的事务：
 数据包的格式 主机间交换数据的方式 主机间定位的方式  网页读写就是一个好的案例，我们现在就可以开始分析他们。
应用层：简单的文本数据交换 在打开网页的时候，我们的浏览器往往会向对应的服务器发送一个数据包，作为请求数据
以启动我们信息管理实验室的首页为例，在启动网页以后，我们可以按下 F12 打开网络开发者工具（FireFox），看到网页浏览器的请求数据包。
将其中的重要信息进行提取，可以得到
GET / HTTP/1.1 它指出了需要进行的动作 &amp;lsquo;GET&amp;rsquo;（获取），要获取的对象为&amp;rsquo;/&amp;rsquo;（代表网站根目录，一般情况下就是网站的首页），而 HTTP/1.1 则是这一协议的名称与版本号，它是一个应用层协议，对于类似于上面这样的可读文本进行了相关的规定，确保我们的应用之间可以以一种合理的形式请求数据，发送数据。
这种以我们可以轻松阅读的文本格式所进行的数据收发，就是应用层所进行的操作，如你所见，比起复杂的电子信号传输，它非常简单，易懂。
我们大部分的开发，就是在应用层上进行的。
传输层：以合理的方式进行数据交接 在请求数据包填写完成之后，我们需要选择一种合理的方式，将我们的请求数据包发送到服务器上
数据包的收发读写，是两台不同主机之间的数据交换，因此，我们当然需要找到一种稳定的数据交换方式。
这就是传输层的工作，完成这份工作的协议分为 TCP 与 UDP 两种，对于我们的网页浏览工作而言，我们往往选择 TCP 协议。
网络层：定位我们的网络设备 在选择数据的传输方式之后，我们还需要正式定位目标服务器的地址，将我们的数据包传输过去
在这里，我们可以暂时切断我们的网络连接，并对我们网页浏览器发送的数据包进行查看。
可以很明确地发现，我们的请求数据包，协议等依旧保持不变，唯一的区别在于 &amp;lsquo;We can&amp;rsquo;t connect to the server&amp;rsquo;（我们无法连接到服务器）
从硬件上看，这是因为两台主机之间的数据链路没能建立，而在软件上看，错误在于：没能完成对目标主机的定位工作。
而当我们再次完成网络连接以后，我们可以继续顺利地连接网络，不过这一次，我们可以更换一种连接方式，选择 ping
这一次，出现了一个数字串 14.215.177.38，这被称为 “IP地址&amp;quot;（IPv4），它的实质是一个二进制数字串，代表了网络设备的地址
这种采用二进制数字串标识设备，确定连接地址的工作，就是网络层的工作，它需要来自于硬件的支持。
链路层与物理层：来自于硬件层面的支持 对于软件开发者而言，我们可以更多的对于这些硬件层面的协议保持一个 “知道有，不了解过多&amp;quot; 的态度，因为这些复杂的硬件层面事物，更多的由操作系统与硬件驱动为我们代劳，我们的精力，可以集中于应用层、传输层与网络层这些软件层上面的事物，并依托操作系统的系统调用（实际上就是一组设计良好的C语言函数)进行处理。
小结：分层模型与 OSI 参考模型 分层模型的正式模型是“TCP/IP 模型“，它是应用广泛的现实主义模型，而 OSI 模型是一个理论上的模型，我们可以把他们作一个简单的了解。
客户端服务器模式 许多的网络书籍喜欢将计算机网络数据的读写划分为“客户端服务器模型&amp;quot;与“P2P模型&amp;quot;，而我本人则更加倾向于：两种模型没有本质上的区别，他们都是主机与主机之间的数据读写。
唯一的不同在于，哪一方主机预先发起了数据交换的请求。
案例：网页浏览 还是以网页浏览为案例，只不过，这一次，我们以“远程文件读写&amp;quot;的方式去看待。
我们欢迎你尝试如下的指令（假定你安装了 php 包，并且属于 Linux 操作系统）" />
  <meta name="description" content="在前文中，我们对计算机网络的微观层面与宏观层面进行了简单的分析，发现：在进行软件层上的网络程序设计时，我们可以将网络数据的读写视作为对“远程文件&amp;quot;的读写。
扎根于这一基础之上，我们计划更加深入地对计算机网络开发进行讨论，以分层模型与客户端服务器模式进行切入。
分层模型 分层模型的本质，就是对“主机-主机&amp;quot;中的流程进行分解，下面，我们可以通过文字对这一完整的流程进行叙述，并最后将其总结为“分层模型&amp;quot;。
对于一名软件设计者而言，想要顺利地完成网络数据的读写，就必须确定如下的事务：
 数据包的格式 主机间交换数据的方式 主机间定位的方式  网页读写就是一个好的案例，我们现在就可以开始分析他们。
应用层：简单的文本数据交换 在打开网页的时候，我们的浏览器往往会向对应的服务器发送一个数据包，作为请求数据
以启动我们信息管理实验室的首页为例，在启动网页以后，我们可以按下 F12 打开网络开发者工具（FireFox），看到网页浏览器的请求数据包。
将其中的重要信息进行提取，可以得到
GET / HTTP/1.1 它指出了需要进行的动作 &amp;lsquo;GET&amp;rsquo;（获取），要获取的对象为&amp;rsquo;/&amp;rsquo;（代表网站根目录，一般情况下就是网站的首页），而 HTTP/1.1 则是这一协议的名称与版本号，它是一个应用层协议，对于类似于上面这样的可读文本进行了相关的规定，确保我们的应用之间可以以一种合理的形式请求数据，发送数据。
这种以我们可以轻松阅读的文本格式所进行的数据收发，就是应用层所进行的操作，如你所见，比起复杂的电子信号传输，它非常简单，易懂。
我们大部分的开发，就是在应用层上进行的。
传输层：以合理的方式进行数据交接 在请求数据包填写完成之后，我们需要选择一种合理的方式，将我们的请求数据包发送到服务器上
数据包的收发读写，是两台不同主机之间的数据交换，因此，我们当然需要找到一种稳定的数据交换方式。
这就是传输层的工作，完成这份工作的协议分为 TCP 与 UDP 两种，对于我们的网页浏览工作而言，我们往往选择 TCP 协议。
网络层：定位我们的网络设备 在选择数据的传输方式之后，我们还需要正式定位目标服务器的地址，将我们的数据包传输过去
在这里，我们可以暂时切断我们的网络连接，并对我们网页浏览器发送的数据包进行查看。
可以很明确地发现，我们的请求数据包，协议等依旧保持不变，唯一的区别在于 &amp;lsquo;We can&amp;rsquo;t connect to the server&amp;rsquo;（我们无法连接到服务器）
从硬件上看，这是因为两台主机之间的数据链路没能建立，而在软件上看，错误在于：没能完成对目标主机的定位工作。
而当我们再次完成网络连接以后，我们可以继续顺利地连接网络，不过这一次，我们可以更换一种连接方式，选择 ping
这一次，出现了一个数字串 14.215.177.38，这被称为 “IP地址&amp;quot;（IPv4），它的实质是一个二进制数字串，代表了网络设备的地址
这种采用二进制数字串标识设备，确定连接地址的工作，就是网络层的工作，它需要来自于硬件的支持。
链路层与物理层：来自于硬件层面的支持 对于软件开发者而言，我们可以更多的对于这些硬件层面的协议保持一个 “知道有，不了解过多&amp;quot; 的态度，因为这些复杂的硬件层面事物，更多的由操作系统与硬件驱动为我们代劳，我们的精力，可以集中于应用层、传输层与网络层这些软件层上面的事物，并依托操作系统的系统调用（实际上就是一组设计良好的C语言函数)进行处理。
小结：分层模型与 OSI 参考模型 分层模型的正式模型是“TCP/IP 模型“，它是应用广泛的现实主义模型，而 OSI 模型是一个理论上的模型，我们可以把他们作一个简单的了解。
客户端服务器模式 许多的网络书籍喜欢将计算机网络数据的读写划分为“客户端服务器模型&amp;quot;与“P2P模型&amp;quot;，而我本人则更加倾向于：两种模型没有本质上的区别，他们都是主机与主机之间的数据读写。
唯一的不同在于，哪一方主机预先发起了数据交换的请求。
案例：网页浏览 还是以网页浏览为案例，只不过，这一次，我们以“远程文件读写&amp;quot;的方式去看待。
我们欢迎你尝试如下的指令（假定你安装了 php 包，并且属于 Linux 操作系统）" />
  <meta property="og:locale" content="zh-cn" /><meta property="og:image" content="" />
  

  
    <style>body{font-family:bree serif,sans-serif;-webkit-font-smoothing:antialiased;margin:0 20px}article{max-width:800px;margin-left:auto;margin-right:auto}a{color:#000;text-decoration:none}a:hover{font-weight:600;text-decoration:underline}.post-ads{margin:50px 0}.markdown-body{font-size:18px;max-width:100%}.markdown-body a{text-decoration:underline;text-decoration-color:#000}.markdown-body blockquote{margin:0;padding:0 1em;color:#57606a;border-left:.25em solid #d0d7de}.markdown-body pre{padding:16px;overflow:auto;border-radius:10px}.markdown-body code{padding:.2em .4em;font-size:85%;background-color:#f6f8fa;border-radius:6px}.markdown-body pre>code{padding:0;font-size:100%;background-color:inherit;border:0}.Chinese .markdown-body{line-height:200%}.site-date-catalog{font-size:2rem}.header-title{font-size:2rem;font-weight:700;margin-top:32px;font-family:bungee shade,sans-serif}.header-title a{text-decoration:none}.header-subtitle{color:#666}.header-items{margin:10px 0}.header-item{margin:0 5px}.header-line{width:100%;border-width:2px;border-color:#482936;border-style:solid none none none}.lang-switch{font-weight:600}#posts-list{min-height:600px}.posts-line{font-size:1.2rem;margin:12px 0}.posts-categories{font-size:.8rem;margin:auto;text-align:center}.posts-category{padding:3px 0;border:#000 2px solid;border-radius:5px}.site-footer{margin-top:50px}.site-footer-item{margin-right:12px}.post-content img{max-width:100%;display:block;margin-right:auto;margin-top:12px}.post-header{margin-bottom:50px}.post-title{font-size:2rem;font-weight:600}.post-tags{display:inline-block;font-weight:600;padding:2px 5px;margin-right:6px;margin-top:4px;border:#000 2px solid;border-radius:5px}.post-date{font-weight:800;font-style:italic}.post-author{float:right;font-weight:600}.page-content{min-height:60%}.post-content{margin-bottom:50px}.post-content p{hyphens:auto;line-height:1.8;text-justify:ideographic;margin-bottom:1em}.related-content{border-width:3px;border-style:solid;border-color:#000;padding:0 10px;margin-bottom:50px;margin-top:100px}.related-content li{margin:5px 0}.taxonomy-term{font-size:3rem}.gallery-img{text-align:center}.gallery-img span{text-align:center}.gallery-img-desc{font-size:.8em;font-weight:800}@media screen and (max-width:600px){.header-title,.header-subtitle,.header-items{text-align:center}.posts-line{font-size:16px}.markdown-body{font-size:16px}.post-title{font-size:2rem}.post-content p{letter-spacing:.05em}}@media screen and (max-width:48em){.posts-category{display:none}}</style>
  
  
    <style>.container,.container-fluid{margin-right:auto;margin-left:auto}.container-fluid{padding-right:2rem;padding-left:2rem}.row{box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:initial;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-.5rem;margin-left:-.5rem}.row.reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.col.reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-offset-0,.col-xs-offset-1,.col-xs-offset-10,.col-xs-offset-11,.col-xs-offset-12,.col-xs-offset-2,.col-xs-offset-3,.col-xs-offset-4,.col-xs-offset-5,.col-xs-offset-6,.col-xs-offset-7,.col-xs-offset-8,.col-xs-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:none;padding-right:.5rem;padding-left:.5rem}.col-xs{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-xs-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-xs-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-xs-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-xs-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-xs-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-xs-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-xs-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-xs-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-xs-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-xs-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-xs-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-xs-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.start-xs{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-xs{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-xs{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-xs{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-xs{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-xs{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-xs{-ms-flex-pack:distribute;justify-content:space-around}.between-xs{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-xs{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-xs{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}@media only screen and (min-width:48em){.container{width:49rem}.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-offset-0,.col-sm-offset-1,.col-sm-offset-10,.col-sm-offset-11,.col-sm-offset-12,.col-sm-offset-2,.col-sm-offset-3,.col-sm-offset-4,.col-sm-offset-5,.col-sm-offset-6,.col-sm-offset-7,.col-sm-offset-8,.col-sm-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:none;padding-right:.5rem;padding-left:.5rem}.col-sm{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-sm-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-sm-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-sm-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-sm-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-sm-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-sm-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-sm-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-sm-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-sm-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-sm-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-sm-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-sm-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.start-sm{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-sm{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-sm{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-sm{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-sm{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-sm{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-sm{-ms-flex-pack:distribute;justify-content:space-around}.between-sm{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-sm{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-sm{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}@media only screen and (min-width:64em){.container{width:65rem}.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-offset-0,.col-md-offset-1,.col-md-offset-10,.col-md-offset-11,.col-md-offset-12,.col-md-offset-2,.col-md-offset-3,.col-md-offset-4,.col-md-offset-5,.col-md-offset-6,.col-md-offset-7,.col-md-offset-8,.col-md-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:none;padding-right:.5rem;padding-left:.5rem}.col-md{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-md-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-md-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-md-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-md-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-md-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-md-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-md-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-md-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-md-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-md-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-md-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-md-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.start-md{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-md{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-md{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-md{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-md{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-md{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-md{-ms-flex-pack:distribute;justify-content:space-around}.between-md{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-md{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-md{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}@media only screen and (min-width:75em){.container{width:76rem}.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-offset-0,.col-lg-offset-1,.col-lg-offset-10,.col-lg-offset-11,.col-lg-offset-12,.col-lg-offset-2,.col-lg-offset-3,.col-lg-offset-4,.col-lg-offset-5,.col-lg-offset-6,.col-lg-offset-7,.col-lg-offset-8,.col-lg-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:none;padding-right:.5rem;padding-left:.5rem}.col-lg{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-lg-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-lg-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-lg-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-lg-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-lg-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-lg-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-lg-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-lg-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-lg-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-lg-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-lg-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-lg-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.start-lg{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-lg{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-lg{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-lg{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-lg{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-lg{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-lg{-ms-flex-pack:distribute;justify-content:space-around}.between-lg{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-lg{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-lg{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}</style>
  

  

  <link href="/index.xml" rel="alternate" type="application/rss+xml"
    title="信息管理实验室">
  
  <link rel="preconnect" href="https://fonts.gstatic.com">
  <link href="https://fonts.googleapis.com/css?family=Bree+Serif|Bungee+Shade" rel="stylesheet">
  
  

  
  
</head>


<body>
  <article class="post " id="article">
    <div class="row">
      <div class="col-xs-12">
        <div class="site-header">
          
<header>
  <div class="header-title">
    <a href="/"
      >信息管理实验室</a
    >
  </div>
  <div class="header-subtitle"></div>
</header>
<div class="row end-md center-xs header-items">
  
  <div class="header-item">
    <a href="/posts/%e4%bd%a0%e5%a5%bd%e6%9c%8b%e5%8f%8b/" target="_blank">About</a>
  </div>
  
  <div class="header-item">
    <a href="/tags/%e6%88%91%e4%bb%ac%e7%9a%84%e4%bc%99%e4%bc%b4/" target="_blank">Friends</a>
  </div>
  
  <div class="header-item">
    <a href="/tags/%e7%a4%be%e5%8c%ba%e4%b9%a6%e7%b1%8d/" target="_blank">Books</a>
  </div>
  
</div>
<div class="row end-xs">
   
</div>
<div class="header-line"></div>

        </div>
        <header class="post-header">
          <h1 class="post-title">学习历程：分层模型与客户端服务器模式</h1>
          
          <div class="row post-desc">
            <div class="col-xs-6">
              
              <time class="post-date">
                2023-02-04
              </time>
              
              
              
              <a href="/series/%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%bd%91%e7%bb%9c%e5%ad%a6%e4%b9%a0%e5%8e%86%e7%a8%8b/"><strong>&nbsp;《计算机网络学习历程》</strong></a>
              
              
              <br>
            </div>
          </div>
          <div class="row end-xs">
            
              <a href="/author/%e6%95%ac%e7%ab%a0/"><strong>&nbsp;@敬章</strong></a>        
            
          </div>
          
        </header>

        <div class="post-content markdown-body">
          
          <p>在前文中，我们对计算机网络的微观层面与宏观层面进行了简单的分析，发现：在进行软件层上的网络程序设计时，我们可以将网络数据的读写视作为对“远程文件&quot;的读写。</p>
<p>扎根于这一基础之上，我们计划更加深入地对计算机网络开发进行讨论，以分层模型与客户端服务器模式进行切入。</p>
<h2 id="分层模型">分层模型</h2>
<p><img src="image/index/1675510473544.png" alt="1675510473544"></p>
<p>分层模型的本质，就是对“主机-主机&quot;中的流程进行分解，下面，我们可以通过文字对这一完整的流程进行叙述，并最后将其总结为“分层模型&quot;。</p>
<p>对于一名软件设计者而言，想要顺利地完成网络数据的读写，就必须确定如下的事务：</p>
<ol>
<li>数据包的格式</li>
<li>主机间交换数据的方式</li>
<li>主机间定位的方式</li>
</ol>
<p>网页读写就是一个好的案例，我们现在就可以开始分析他们。</p>
<h3 id="应用层简单的文本数据交换">应用层：简单的文本数据交换</h3>
<p>在打开网页的时候，我们的浏览器往往会向对应的服务器发送一个数据包，作为请求数据</p>
<p>以启动我们信息管理实验室的首页为例，在启动网页以后，我们可以按下 <code>F12</code> 打开网络开发者工具（FireFox），看到网页浏览器的请求数据包。</p>
<p>将其中的重要信息进行提取，可以得到</p>
<pre tabindex="0"><code>GET / HTTP/1.1
</code></pre><p>它指出了需要进行的动作 &lsquo;GET&rsquo;（获取），要获取的对象为&rsquo;/&rsquo;（代表网站根目录，一般情况下就是网站的首页），而 HTTP/1.1 则是这一协议的名称与版本号，它是一个<strong>应用层协议</strong>，对于类似于上面这样的可读文本进行了相关的规定，确保<strong>我们的应用之间</strong>可以以一种合理的形式请求数据，发送数据。</p>
<p>这种以我们可以轻松阅读的文本格式所进行的数据收发，就是应用层所进行的操作，如你所见，比起复杂的电子信号传输，它非常简单，易懂。</p>
<p>我们大部分的开发，就是在应用层上进行的。</p>
<h3 id="传输层以合理的方式进行数据交接">传输层：以合理的方式进行数据交接</h3>
<p>在请求数据包填写完成之后，我们需要选择一种合理的方式，将我们的请求数据包发送到服务器上</p>
<p>数据包的收发读写，是两台不同主机之间的数据交换，因此，我们当然需要找到一种稳定的数据交换方式。</p>
<p>这就是<strong>传输层</strong>的工作，完成这份工作的协议<strong>分为 TCP 与 UDP 两种</strong>，对于我们的网页浏览工作而言，我们往往选择 TCP 协议。</p>
<h3 id="网络层定位我们的网络设备">网络层：定位我们的网络设备</h3>
<p>在选择数据的传输方式之后，我们还需要正式定位目标服务器的地址，将我们的数据包传输过去</p>
<p>在这里，我们可以暂时切断我们的网络连接，并对我们网页浏览器发送的数据包进行查看。</p>
<p><img src="image/index/1675511758102.png" alt="1675511758102"></p>
<p>可以很明确地发现，我们的请求数据包，协议等依旧保持不变，唯一的区别在于 &lsquo;<strong>We can&rsquo;t connect to the server</strong>&rsquo;（我们无法连接到服务器）</p>
<p>从硬件上看，这是因为两台主机之间的数据链路没能建立，而在软件上看，错误在于：没能完成对目标主机的定位工作。</p>
<p>而当我们再次完成网络连接以后，我们可以继续顺利地连接网络，不过这一次，我们可以更换一种连接方式，选择 <code>ping</code></p>
<p><img src="image/index/1675513657547.png" alt="1675513657547"></p>
<p>这一次，出现了一个数字串 <code>14.215.177.38</code>，这被称为 “IP地址&quot;（IPv4），它的<strong>实质是一个二进制数字串</strong>，<strong>代表了网络设备的地址</strong></p>
<p>这种采用二进制数字串标识设备，确定连接地址的工作，就是网络层的工作，它<strong>需要来自于硬件的支持</strong>。</p>
<h3 id="链路层与物理层来自于硬件层面的支持">链路层与物理层：来自于硬件层面的支持</h3>
<p>对于软件开发者而言，我们可以更多的对于这些硬件层面的协议保持一个 “知道有，不了解过多&quot; 的态度，因为这些复杂的硬件层面事物，更多的由操作系统与硬件驱动为我们代劳，我们的精力，可以集中于应用层、传输层与网络层这些软件层上面的事物，并依托操作系统的系统调用（实际上就是一组设计良好的C语言函数)进行处理。</p>
<h3 id="小结分层模型与-osi-参考模型">小结：分层模型与 OSI 参考模型</h3>
<p>分层模型的正式模型是“TCP/IP 模型“，它是应用广泛的现实主义模型，而 OSI 模型是一个理论上的模型，我们可以把他们作一个简单的了解。</p>
<p><img src="image/index/1675514941019.png" alt="1675514941019"></p>
<h2 id="客户端服务器模式">客户端服务器模式</h2>
<p>许多的网络书籍喜欢将计算机网络数据的读写划分为“客户端服务器模型&quot;与“P2P模型&quot;，而我本人则更加倾向于：两种模型没有本质上的区别，他们都是主机与主机之间的数据读写。</p>
<p>唯一的不同在于，哪一方主机预先发起了数据交换的请求。</p>
<h4 id="案例网页浏览">案例：网页浏览</h4>
<p>还是以网页浏览为案例，只不过，这一次，我们以“远程文件读写&quot;的方式去看待。</p>
<p>我们欢迎你尝试如下的指令（假定你安装了 php 包，并且属于 Linux 操作系统）</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mkdir website
</span></span><span style="display:flex;"><span>cd website
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;&lt;h1&gt;Hello world&lt;/h1&gt;&#34;</span> &gt; index.html
</span></span><span style="display:flex;"><span>php -S 127.0.0.1:8000
</span></span></code></pre></div><p><img src="image/index/1675515947030.png" alt="1675515947030"></p>
<p>在顺利得到如下的页面以后，我们可以在我们的 <code>website</code> 文件夹之中，创建一个新的网页文件（我将其命名为 new.html），并写上自己喜欢的内容。</p>
<p><img src="image/index/1675516108157.png" alt="1675516108157"></p>
<p>再在浏览器里面输入，<code>new.html</code></p>
<p><img src="image/index/1675516139429.png" alt="1675516139429"></p>
<p>就可以得到新的内容。</p>
<h4 id="分析客户端服务器模式的良好体现">分析：客户端服务器模式的良好体现</h4>
<p>这个实验非常良好地体现出了我们的客户端服务器模式，一方面，我们可以看到，<code>php</code> 所提供的服务器服务，非常良好地进行着响应，在我们启动浏览器进行对应的数据请求的时候（如第一次，我们请求的网页路径就是 <code>/</code> ，也就是网站的首页文件 <code>index.html</code>），它将对应的文件很好地传输给我们，交付我们的浏览器进行解析，从而得到正确的结果；而另一方面，我们的浏览器也非常良好的起到了客户端的作用，它向我们的服务器发起请求，希望能够获取到对应的数据，事实上，它也获取到了（就是最后的网页文件)。</p>
<p>整个流程可以以下面的简化图进行看待：</p>
<p><img src="image/index/1675516926884.png" alt="1675516926884"></p>
<p>可以看到，<strong>只需要完成彼此之间的连接，就可以进行数据的读写</strong>，而不再需要进行什么区分。</p>
<p>换而言之，我们就可以将客户端服务器模型视作一个“连接的先后问题&quot;，先发起连接的是客户端，接受连接的就是服务器。</p>
<h3 id="小论p2p-模型">小论：P2P 模型</h3>
<p>很多网络书籍的“P2P模型&quot;，在我本人看来，就是客户端服务器模型的一个变种，并没有本质上的区别。</p>
<p>以我们常见的游戏服务器作为案例，在局域网中，总会有一个人作为搭建服务器的第一人，而其它连接进入这个服务器的人，又可以为其它的“弟兄们&quot;提供对应的服务器服务，这就是一种“P2P&quot;，它让接入“服务器&quot;的客户端，也成为网络服务的提供者。</p>
<p>而如果我们从文件读写的角度上面看，它并没有什么大不了的事情，只不过，我们受到了来自于“远程文件&quot;的信息，从而也开始启动我们自己的网络服务了而已。</p>
<p>殊途同归，这就是我个人的评价。</p>

        </div>

        <div class="row middle-xs">
          <div class="col-xs-12">
            
            <div class="post-tags">
              <a href="/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">
                计算机网络
              </a>
            </div>
            
            <div class="post-tags">
              <a href="/tags/%E4%BF%A1%E6%81%AF%E7%AE%A1%E7%90%86/">
                信息管理
              </a>
            </div>
            
          </div>
        </div>
        
          <div class="row">
            <div class="col-xs-12">
              
            </div>
          </div>

          

<div class="related-content">
  <h3>Related Posts</h3>
  <ul>
    
    <li><a href="/posts/%E7%A4%BE%E5%8C%BA%E4%B9%A6%E7%B1%8D/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E5%8E%86%E7%A8%8B/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%85%A5%E9%97%A8/">学习历程：计算机网络入门</a></li>
    
  </ul>

</div>


          
          
          <div style="height: 50px;"></div>
          
        

        <div class="site-footer">
  
  
</div>

      </div>
    </div>
  </article>

  

<script>
  
  
    
    
  
</script>

  

</body>

</html>